#include <stdio.h>

#include "zepto.h"

void print_sexpr(struct zepto *expr);

void print_atom(struct zepto *expr)
{
  switch(expr->type) {
    case ZEPTO_INTEGER:
      printf("%ld", expr->data.integer);
      break;
    case ZEPTO_STRING:
      printf("%ls", expr->data.string.data);
      break;
    case ZEPTO_SYMBOL:
      printf("%s", expr->data.symbol);
      break;
    case ZEPTO_BOOL:
      printf(expr->data.boolean ? "#t" : "#f");
      break;
    case ZEPTO_NIL:
      printf("NIL");
      break;
    case ZEPTO_CHAR:
      printf("%c", expr->data.character);
      break;
    default:
      break;
  }
}

void print_pair(struct zepto *expr)
{

  print_sexpr(expr->data.pair.car);
  if(expr->data.pair.cdr->type == ZEPTO_PAIR) {
    printf(" ");
    print_pair(expr->data.pair.cdr);
  } else if(expr->data.pair.cdr->type == ZEPTO_NIL) {
    return;
  } else {
    printf(" . ");
    print_sexpr(expr->data.pair.cdr);
  }
}

void print_sexpr(struct zepto *expr)
{
  if(expr->type == ZEPTO_PAIR) {
    printf("(");
    print_pair(expr);
    printf(")");
  } else {
    print_atom(expr);
  }
}
